home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / MadBlanker / MadBlanker.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  22KB  |  943 lines

  1. /**************************************************************************/
  2. /*                                                                        */
  3. /*  MadBlanker version v2.0           (Y.A.U.P.)                          */
  4. /*                                   (Yet Another Useless Program)        */
  5. /*                                                                        */
  6. /*  A screen blanker that opens a bouncing window on a blank screen       */
  7. /*  through which you can see the screen behind.                          */
  8. /*                                                                        */
  9. /*    Written by a Paranoid FOR Paranoids.                                */
  10. /*                                                                        */
  11. /*  The source, executable, and document are completely public domain.    */
  12. /*                                                                        */
  13. /*  As always, feel free to improve the program... it could have been     */
  14. /*  a little more original than a bouncing box! I'm just too lazy :-)     */
  15. /*                (a bouncing ball maybe ? ;-)                            */
  16. /*                                                                        */
  17. /*      Enjoy,                                                            */
  18. /*                                                                        */
  19. /*         Khaled Mardam-Bey                                              */
  20. /*                                                                        */
  21. /*                                                                        */
  22. /*    Compiled with ManxC 3.6a                                            */
  23. /*                                                                        */
  24. /**************************************************************************/
  25.  
  26. #include <libraries/dos.h>
  27. #include <libraries/dosextens.h>
  28. #include <libraries/diskfont.h>
  29. #include <devices/timer.h>
  30. #include <devices/trackdisk.h>
  31. #include <devices/input.h>
  32. #include <devices/inputevent.h>
  33. #include <exec/lists.h>
  34. #include <exec/libraries.h>
  35. #include <exec/io.h>
  36. #include <exec/execbase.h>
  37. #include <exec/types.h>
  38. #include <exec/devices.h>
  39. #include <exec/memory.h>
  40. #include <exec/exec.h>
  41. #include <exec/ports.h>
  42. #include <exec/tasks.h>
  43. #include <exec/types.h>
  44. #include <exec/interrupts.h>
  45. #include <exec/memory.h>
  46. #include <exec/ports.h>
  47. #include <functions.h>
  48. #include <graphics/gfx.h>
  49. #include <graphics/gfxbase.h>
  50. #include <graphics/gfxmacros.h>
  51. #include <graphics/rastport.h>
  52. #include <graphics/view.h>
  53. #include <graphics/copper.h>
  54. #include <graphics/gels.h>
  55. #include <graphics/regions.h>
  56. #include <graphics/clip.h>
  57. #include <graphics/text.h>
  58. #include <hardware/dmabits.h>
  59. #include <hardware/custom.h>
  60. #include <intuition/intuition.h>
  61. #include <intuition/intuitionbase.h>
  62. #include <stdio.h>
  63. #include <ctype.h>
  64. #include <fcntl.h>
  65.  
  66. #define LAMIGA      0x66
  67. #define QUITSKEY    0x3A
  68.  
  69. #define BLANKON     0x1
  70. #define WINNY       0x2
  71. #define CHANGEPRI   0x4
  72. #define QUIT        0x8
  73.  
  74. char PortName[]    = "MaDbLAnk";
  75. char defPortName[] = "MadBlaNKeR";
  76. char writtenby[]   = " MadBlanker v2.0 by K.Mardam-Bey 1st November 1990\n\n";
  77.  
  78. struct IntuitionBase *IntuitionBase   = NULL;
  79. struct GfxBase       *GfxBase         = NULL;
  80. struct MsgPort       *inputPort       = NULL;
  81. struct IOStdReq      *inputReq        = NULL;
  82. struct Screen        *s2, *wbs, *s    = NULL;
  83. struct Window        *w = NULL, *w2   = NULL;
  84. struct ViewPort      *vp = NULL, *vp2 = NULL;
  85. struct ColorMap      *cm              = NULL;
  86. struct UCopList      *cl              = NULL;
  87. struct TextAttr      attr             = NULL;
  88. struct TextFont      *newfont         = NULL;
  89. struct IntuiMessage *message          = NULL;
  90. struct BitMap        b2;
  91. struct RastPort      rp, rp2;
  92. struct Preferences   MyCopy;
  93.  
  94. struct NewScreen newscreen = {
  95.   0,0,0,0,0,0,0,NULL,CUSTOMSCREEN,NULL,(UBYTE *)"MadBlankerScreen",NULL,NULL
  96. };
  97.  
  98. struct NewWindow newwindow = {
  99.   0,0,0,0,3,2,  NULL,NULL,  NULL,NULL,  NULL,
  100.   NULL,  NULL,  0,0,0,0, WBENCHSCREEN
  101. };
  102.  
  103. struct NewWindow newwindow2 = {
  104. 5,5,10,10,0,0,
  105. MOUSEBUTTONS | MOUSEMOVE | RAWKEY,
  106. REPORTMOUSE | NOCAREREFRESH | ACTIVATE | BORDERLESS | BACKDROP,
  107. NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN
  108. };
  109.  
  110. UWORD colours;
  111. USHORT WB = 0x11;
  112. USHORT bitplanes, bg = 0;
  113. USHORT PointerData[POINTERSIZE];
  114.  
  115. int same, ham = 0, cleared = 0;
  116. short f, n, n2, n3, r, wt = 0, showstatus = 0;
  117. short s2depth, myc = 0, ht = 0, black = 0, event, lpri;
  118. short waiting = 0, blank = 0, i = 0, k = 0, j = 0, c = 0;
  119. short lamiga = 0, bk = 0;
  120. long lsec = 0, micro = 0, cols, class, signum = -1, cw;
  121.  
  122. struct InputEvent phoney;
  123. struct HotInfo
  124. {
  125.   struct Task *hotTask;
  126.   long  hotSig;
  127. } hotStuff;
  128.  
  129. struct Interrupt handlerStuff;
  130. struct defPort
  131. {
  132.   struct MsgPort mp;
  133.   short quit;
  134.   short wait;
  135.   short now;
  136.   short rgb;
  137.   short windo;
  138.   short grow;
  139.   short pri;
  140.   short bench;
  141.   short delay;
  142.   short scroll;
  143.   short x,y;
  144.   struct Window *win;
  145. };
  146.  
  147. struct defPort *dPtr;
  148.  
  149. void HandlerInterface()
  150. {
  151. #asm
  152.   movem.l a4,-(sp)
  153.   jsr _geta4#
  154.   movem.l   A0/A1,-(sp)
  155.   jsr       _myhandler
  156.   addq.l    #8,A7
  157.   movem.l (sp)+,a4
  158. #endasm
  159. }
  160.  
  161. struct InputEvent *myhandler(ev1, hotStuff)
  162. struct InputEvent *ev1;
  163. struct HotInfo *hotStuff;
  164. {
  165.   struct InputEvent *ev, *last;
  166.   short removeit;
  167.   short evcode;
  168.  
  169.   event = 0;
  170.  
  171.   for (ev=ev1,last = NULL; ev; ev=ev->ie_NextEvent)
  172.   {
  173.     evcode = ev->ie_Code;
  174.     removeit = 0;
  175.  
  176.     if ((ev->ie_Class == IECLASS_RAWKEY) || (ev->ie_Class == IECLASS_RAWMOUSE)) {
  177.       waiting = 0;
  178.  
  179.       if (evcode == (LAMIGA | 0x80)) lamiga = 0;
  180.       else
  181.       if (evcode == LAMIGA) lamiga = 1;
  182.       else
  183.       if ((evcode == QUITSKEY) && (lamiga)) {
  184.         removeit = 1;
  185.         bk = 1;
  186.         event |= QUIT;
  187.       }
  188.     }
  189.     else
  190.     if ((ev->ie_Class == IECLASS_TIMER))
  191.     {
  192.       if (lpri != dPtr->pri) event |= CHANGEPRI;
  193.  
  194.       if (dPtr->quit) { dPtr->quit = 0; event |= QUIT; }
  195.  
  196.       if ((dPtr->now) && (!blank)) {
  197.         dPtr->now = 0;
  198.         blank = 1;
  199.         event |= BLANKON;
  200.       }
  201.  
  202.       if ((waiting >= dPtr->wait) && (!blank)) {
  203.         blank = 1;
  204.         event |= BLANKON;
  205.       }
  206.  
  207.       if ((ev->ie_TimeStamp.tv_secs != lsec) && (ev->ie_TimeStamp.tv_micro >= 500000)) {
  208.         lsec = ev->ie_TimeStamp.tv_secs;
  209.  
  210.         if (dPtr->win != NULL) {
  211.           wt += 1;
  212.           if (wt >= 3) { wt = 0; event |= WINNY; }
  213.         }
  214.  
  215.         waiting = waiting + 1;
  216.       }
  217.     }
  218.  
  219.     if (removeit)
  220.       if (last == NULL)
  221.         ev1 = ev->ie_NextEvent;
  222.       else
  223.         last->ie_NextEvent = ev->ie_NextEvent;
  224.     else
  225.       last = ev;
  226.     }
  227.  
  228.   if (event)
  229.     Signal(hotStuff->hotTask,hotStuff->hotSig);
  230.   return(ev1);
  231. }
  232.  
  233. main(argc,argv)
  234. int argc;
  235. char *argv[];
  236. {
  237.   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
  238.   if (!IntuitionBase) Eggzit("[IntuitionBase Hiding]",0);
  239.  
  240.   GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0L);
  241.   if (!GfxBase) Eggzit("[GfxBase Hiding]",0);
  242.  
  243.   GetPointer();
  244.  
  245.   dPtr = (struct defPort *) FindPort(defPortName);
  246.  
  247.   if (dPtr) {
  248.     if (argc < 2) {
  249.       dPtr->quit = 1;
  250.       if (!dPtr->windo) printf("MadBlanker Removed\n");
  251.       Eggzit(NULL,1);
  252.     }
  253.  
  254.     DoParms(argc,argv);
  255.  
  256.     if (showstatus) { MadStatus(); printf("%s",writtenby); }
  257.     else DisplayInfo("MadBlanker Informed",0);
  258.  
  259.     Eggzit(NULL,1);
  260.   }
  261.  
  262.   if (dPtr == NULL)
  263.   {
  264.     if ((dPtr = (struct defPort *) AllocMem((long)sizeof(struct defPort),MEMF_PUBLIC | MEMF_CLEAR)) == NULL)
  265.       Eggzit("[Couldn't Allocate Memory]",0);
  266.  
  267.     dPtr->quit = 0;
  268.     dPtr->now = 0;
  269.     dPtr->wait = 180;
  270.     dPtr->rgb = 0;
  271.     dPtr->windo = 1;
  272.     dPtr->grow = 1;
  273.     dPtr->win = NULL;
  274.     dPtr->bench = 0;
  275.     dPtr->pri = 0;
  276.     dPtr->delay = 0;
  277.     dPtr->scroll = 0;
  278.     dPtr->x = 60;
  279.     dPtr->y = 50;
  280.  
  281.     if (argc > 0) {
  282.       DoParms(argc,argv);
  283.  
  284.       if (showstatus) {
  285.         MadStatus();
  286.         if (argc <= 2) {
  287.           printf(" MadBlanker NOT Installed\n\n%s",writtenby);
  288.           Eggzit(NULL,0);
  289.         }
  290.         printf(" Attempting to Install MadBlanker...\n\n%s",writtenby);
  291.       }
  292.     }
  293.   }
  294.   else {
  295.     DisplayInfo("MadBlanker Informed",0);
  296.     Eggzit(NULL,1);
  297.   }
  298.  
  299.   dPtr->mp.mp_Node.ln_Pri = 0;
  300.   dPtr->mp.mp_Node.ln_Type = NT_MSGPORT;
  301.   NewList(&(dPtr->mp.mp_MsgList));
  302.   dPtr->mp.mp_Node.ln_Name = (char *) &(defPortName);
  303.  
  304.   AddPort(dPtr);
  305.  
  306.   lpri = dPtr->pri;
  307.  
  308.   if((signum = AllocSignal((long)-1)) == -1)
  309.     Eggzit("[Couldn't Allocate Signal]",0);
  310.  
  311.   hotStuff.hotSig = 1 << signum;
  312.   hotStuff.hotTask = FindTask(NULL);
  313.  
  314.   if(!(inputPort = CreatePort(PortName,0)))
  315.     Eggzit("[Couldn't CreatePort]",0);
  316.  
  317.   if(!(inputReq = CreateStdIO(inputPort)))
  318.     Eggzit("[Couldn't CreateStdIO]",0);
  319.  
  320.   handlerStuff.is_Data = (APTR)&hotStuff;
  321.   handlerStuff.is_Code = HandlerInterface;
  322.   handlerStuff.is_Node.ln_Pri = 57;
  323.   handlerStuff.is_Node.ln_Name = "MAdBlnkHan";
  324.  
  325.   if(OpenDevice("input.device",0L,inputReq,0L) != 0)
  326.     Eggzit("[Couldn't OpenDevice]",0);
  327.  
  328.   inputReq->io_Command = IND_ADDHANDLER;
  329.   inputReq->io_Data = (APTR)&handlerStuff;
  330.  
  331.   DoIO(inputReq);
  332.  
  333.   (void)SetTaskPri(FindTask(NULL),(long)dPtr->pri);
  334.  
  335.   DisplayInfo("MadBlanker v2.0 Installed",0);
  336.   printf("Type Left-Amiga-/ To EXIT\n");
  337.  
  338.   for (;;)
  339.   {
  340.     Wait(hotStuff.hotSig);
  341.  
  342.     if (event & CHANGEPRI) {
  343.       lpri = dPtr->pri;
  344.       (void)SetTaskPri(FindTask(NULL),(long)dPtr->pri);
  345.     }
  346.  
  347.     if (event & WINNY)
  348.       CloseWin();
  349.  
  350.     if (event & BLANKON) {
  351.       if (BlankOn()) {
  352.         OhBabyUScrollMeAround();
  353.         BlankOff();
  354.       }
  355.     }
  356.  
  357.     if (event & QUIT)
  358.       Eggzit("MadBlanker Removed",0);
  359.   }
  360. }
  361.  
  362. CloseWin()
  363. {
  364.   if (dPtr->win) CloseWindow(dPtr->win);
  365.   dPtr->win = NULL;
  366. }
  367.  
  368. BlankOn()
  369. {
  370.   blank = 1;
  371.   waiting = 0;
  372.  
  373.   if (s) Eggzit("Error! Screen Exists! Quitting...",0);
  374.  
  375.   if (!dPtr->bench)
  376.     s2 = IntuitionBase->FirstScreen;
  377.   else {
  378.     s = IntuitionBase->FirstScreen;
  379.     do {
  380.       if (s->Flags == WB) goto foundit;
  381.       s = s->NextScreen;
  382.     } while (s);
  383.     s = NULL;
  384.  
  385.   foundit:
  386.     if (s == NULL)
  387.       s2 = IntuitionBase->FirstScreen;
  388.     else s2 = s;
  389.   }
  390.  
  391.   vp2 = &s2->ViewPort;
  392.   cm = vp2->ColorMap;
  393.   s2depth = s2->BitMap.Depth;
  394.  
  395.   Randomize();
  396.  
  397.   GetPointer();
  398.  
  399.   newscreen.LeftEdge = s2->LeftEdge;
  400.   newscreen.TopEdge = s2->TopEdge;
  401.   newscreen.Width = s2->Width;
  402.   newscreen.Height = s2->Height;
  403.   newscreen.DetailPen = s2->DetailPen;
  404.   newscreen.BlockPen = s2->BlockPen;
  405.   newscreen.Depth = s2depth;
  406.   newscreen.ViewModes = vp2->Modes;
  407.  
  408.   if (newscreen.Width > 640) newscreen.Width = 640;
  409.   if (newscreen.Height > 400) newscreen.Height = 400;
  410.  
  411.   n2 = dPtr->rgb;
  412.  
  413.   if (s2depth >= 4) dPtr->rgb = 1;
  414.  
  415.   bitplanes = s2depth;
  416.   for (cols = 1; bitplanes; bitplanes--)
  417.     cols *= 2;
  418.  
  419.   same = black = ham = 0;
  420.  
  421.   if (newscreen.ViewModes & DUALPF) { blank = 0; return(0); }
  422.   if (newscreen.Depth == 6) ham = 1;
  423.  
  424.   if (ham || dPtr->rgb) { dPtr->rgb = 1; black = 0; }
  425.   else {
  426.     for (j=0;j<cols;j++) {
  427.       colours = GetRGB4(cm,j);
  428.       if (colours == (short)0) {
  429.         black = j;
  430.         same = 1;
  431.         j = cols + 1;
  432.       }
  433.     }
  434.  
  435.     if (same == 0) {
  436.       same = 5;
  437.       ht = 4000;
  438.       for (j=1;j<cols;j++) {
  439.         colours = GetRGB4(cm,j);
  440.         if (ht >= colours) { ht = colours; black = j; }
  441.       }
  442.     }
  443.   }
  444.  
  445.   for (i=0; i<POINTERSIZE; i++)
  446.     MyCopy.PointerMatrix[i] = NULL;
  447.   SetPrefs(&MyCopy, (long) sizeof(MyCopy));
  448.  
  449.   cleared = 1;
  450.  
  451.   if ((s = (struct Screen *)OpenScreen(&newscreen)) == NULL)
  452.     Eggzit("[Couldn't Open Screen]",0);
  453.  
  454.   ShowTitle(s,0L);
  455.  
  456.   vp = &s->ViewPort;
  457.   rp = s->RastPort;
  458.  
  459.   newwindow2.Screen = s;
  460.  
  461.   if ((w2 = (struct Window *) OpenWindow(&newwindow2)) == NULL)
  462.     { Eggzit("[Couldn't Open Screen Window]\n"); return(0); }
  463.  
  464.   if (!dPtr->rgb) {
  465.     SetRGB4(vp,0L,0L,0L,0L);
  466.     SetRast(&rp,0L);
  467.   }
  468.  
  469.   for (j=(1-dPtr->rgb); j<cols; j++) {
  470.     colours = GetRGB4(cm,j);
  471.     SetRGB4( vp, j, (LONG) ( ( colours >> 8) & 15 ),
  472.        (LONG) ( ( colours >> 4) & 15 ), (LONG) ( colours & 15 ) );
  473.   }
  474.  
  475.   if (!dPtr->rgb) {
  476.     SetRGB4(vp,black,0L,0L,0L);
  477.     SetRast(&rp,black);
  478.   }
  479.  
  480.   if (dPtr->rgb) {
  481.     black = 0;
  482.     SetRast(&rp,black);
  483.   }
  484.   else {
  485.     if (same == 5) {
  486.       SetRGB4(vp,black,0L,0L,0L);
  487.       SetRast(&rp,black);
  488.     }
  489.   }
  490.  
  491.   myc = 1;
  492.   ht = 0;
  493.  
  494.   for (j=0;j<cols;j++) {
  495.     colours = GetRGB4(cm,j);
  496.     if (ht < colours) { ht = colours; myc = j; }
  497.   }
  498.  
  499.   b2 = s2->BitMap;
  500.  
  501.   SetAPen(&rp,black);
  502.   SetBPen(&rp,black);
  503.   SetOPen(&rp,black);
  504.  
  505.   if (!dPtr->rgb) {
  506.     cl = AllocMem(sizeof(struct UCopList),MEMF_PUBLIC|MEMF_CLEAR);
  507.     bg = (USHORT)GetRGB4(cm,0);
  508.  
  509.     CINIT(cl,4L);
  510.     for (f = 0; f < 200; f++) {
  511.  
  512.       if (s->BitMap.Depth == 1) cw = 64;
  513.       else if (s->BitMap.Depth == 2) cw = 64;
  514.       else if (s->BitMap.Depth == 3) cw = 62;
  515.       else cw = 64;
  516.  
  517.       CWAIT(cl,(LONG)(f),(long)cw);
  518.       CMOVE(cl,custom.color[0],(USHORT)bg);
  519.  
  520.       if (s->BitMap.Depth == 1) cw = 223;
  521.       else if (s->BitMap.Depth == 2) cw = 223;
  522.       else if (s->BitMap.Depth == 3) cw = 223;
  523.       else cw = 223;
  524.  
  525.       CWAIT(cl,(LONG)(f),(long)cw);
  526.       CMOVE(cl,custom.color[0],(USHORT)0);
  527.     }
  528.     CEND(cl);
  529.  
  530.     vp->UCopIns = cl;
  531.     RethinkDisplay();
  532.   }
  533.  
  534.   while (message = (struct IntuiMessage *)GetMsg(w2->UserPort)) {
  535.     class = message->Class;
  536.     ReplyMsg(message);
  537.   }
  538.  
  539.   dPtr->rgb = n2;
  540.  
  541.   return(1);
  542. }
  543.  
  544. /*  Used By the Next TWO functions */
  545.  
  546.  short widt,higt,xinc,yinc,xs,ys,step,xx,yy,xb,yb;
  547.  short swidth,sheight,xbs,ybs,nstep,tb;
  548.  short tope,lefte,twidth,theight;
  549.  short tt,t;
  550.  short xbor,ybor;
  551.  
  552. OhBabyUScrollMeAround()
  553. {
  554.   if (dPtr->win) CloseWindow(dPtr->win);
  555.   dPtr->win = NULL;
  556.  
  557.   xinc = yinc = xs = ys = step = 1;
  558.   nstep = 1;
  559.   xbs = ybs = nstep;
  560.   xbor = 12;
  561.   ybor = 6;
  562.  
  563.   tt = t = tb = 1;
  564.  
  565.   swidth = s->Width;
  566.   sheight = s->Height;
  567.  
  568.   if (swidth > 640) swidth = 640;
  569.   if (sheight > 400) sheight = 400;
  570.  
  571.   xx = RangeRand(swidth/3) + 5;
  572.   yy = RangeRand(sheight/3) + 5;
  573.  
  574.   if (!dPtr->grow) {
  575.     if (dPtr->x > (swidth-xbor)) {
  576.       widt = swidth - xbor - xbor;
  577.       xx = xbor;
  578.     }
  579.     else widt = dPtr->x;
  580.     if (dPtr->y > (sheight-ybor)) {
  581.       higt = sheight - ybor - ybor;
  582.       yy = ybor;
  583.     }
  584.     else higt = dPtr->y;
  585.   }
  586.   else {
  587.     widt = RangeRand(swidth/3) + 70;
  588.     higt = RangeRand(sheight/3) + 20;
  589.   }
  590.  
  591.   xb = swidth / 3;
  592.   yb = sheight / 3;
  593.  
  594.   lefte = xx;
  595.   tope = yy;
  596.   twidth = widt;
  597.   theight = higt;
  598.  
  599.   Calculator();
  600.  
  601.   SetAPen(&rp, black);
  602.  
  603.       do {
  604.  
  605.         for (i = 2; i > 0; i--) {
  606.           Move(&rp,lefte - i, tope - i);
  607.           Draw(&rp,lefte + twidth + i, tope - i);
  608.           Draw(&rp,lefte + twidth + i, tope + theight + i);
  609.           Draw(&rp,lefte - i, tope + theight + i);
  610.           Draw(&rp,lefte - i, tope - i);
  611.         }
  612.  
  613.         if (!CheckS2()) goto stop;
  614.         BltBitMapRastPort(&b2,xb,yb,&rp,lefte,tope,twidth+1,theight+1,0x0C0);
  615.  
  616.         Calculator();
  617.  
  618.         if (dPtr->delay) for (i = 0; i < dPtr->delay; i++);
  619.  
  620.       } while (!CheckWindow());
  621.  
  622. stop:
  623.   Randomize();
  624. }
  625.  
  626. /* Lets do some finite math... */
  627.  
  628. Calculator()
  629. {
  630.         if (dPtr->grow) {
  631.  
  632.           t += 1;
  633.           if (t > 2) {
  634.             t = 0;
  635.             widt += xinc;
  636.           }
  637. skip1:
  638.           if (widt > (swidth / 2)) { xinc = -step; }
  639.           if (widt < (swidth / 9)) { xinc = step; }
  640.  
  641.           tt += 1;
  642.           if (tt > 5) {
  643.             tt = 0;
  644.  
  645.             higt += yinc;
  646. skip2:
  647.             if (higt > (sheight / 2)) { yinc = -step; }
  648.             if (higt < (sheight / 9)) { yinc = step; }
  649.           }
  650.         }
  651.  
  652.         xx = xx + xs;
  653.         if (xx >= (swidth-widt-xbor)) { xx = swidth-widt-xbor; xs = -step; }
  654.         if (xx < xbor) { xx = xbor; xs = step; }
  655.  
  656.         yy = yy + ys;
  657.         if (yy >= sheight-higt-ybor) { yy = sheight-higt-ybor; ys = -step; }
  658.         if (yy < ybor) { yy = ybor; ys = step; }
  659.  
  660.         lefte = xx;
  661.         tope = yy;
  662.         twidth = widt;
  663.         theight = higt;
  664.  
  665.         if (dPtr->scroll) {
  666.           tb += 1;
  667.  
  668.           if (tb > 2) {
  669.             xb = xb + xbs;
  670.             if (xb > (swidth-widt-xbor)) { xb = swidth-widt-xbor - 1; xbs = -nstep; }
  671.             if (xb < xbor) { xb = xbor + 1; xbs = nstep; }
  672.           }
  673.  
  674.           if (tb > 3) {
  675.             yb = yb + ybs;
  676.             if (yb > sheight-higt-ybor) { yb = sheight-higt-ybor - 1; ybs = -nstep; }
  677.             if (yb < ybor) { yb = ybor + 1; ybs = nstep; }
  678.             tb = 0;
  679.           }
  680.         }
  681.         else {
  682.           xb = lefte;
  683.           yb = tope;
  684.         }
  685. }
  686.  
  687. BlankOff()
  688. {
  689.   if (s) ScreenToBack(s);
  690.  
  691.   ResetPointer();
  692.  
  693.   blank = 0;
  694.   waiting = 0;
  695.  
  696.   if (w2) {
  697.     CheckWindow();
  698.     CloseWindow(w2);
  699.     w2 = NULL;
  700.   }
  701.  
  702.   if (s) {
  703.     CloseScreen(s);
  704.     s = NULL;
  705.   }
  706. }
  707.  
  708. /* Cute routine to open one line window and display info */
  709.  
  710. DisplayInfo(text,del)
  711. char *text;
  712. int del;
  713. {
  714.   if (strlen(text) < 1) return;
  715.  
  716.   if (!dPtr->windo) {
  717.     printf("%s\n",text);
  718.     return;
  719.   }
  720.  
  721.   if (dPtr->win) CloseWindow(dPtr->win);
  722.  
  723.   attr.ta_Name = (UBYTE *)"topaz.font";
  724.   attr.ta_YSize = 8;
  725.   attr.ta_Style = 0;
  726.   attr.ta_Flags = 0;
  727.  
  728.   wbs = IntuitionBase->ActiveScreen;
  729.  
  730.   newfont = (struct TextFont *)OpenFont(&attr);
  731.   if (newfont == NULL) { printf("[Couldn't Get Font]\n"); return(0); }
  732.  
  733.   newwindow.LeftEdge = (wbs->Width / 2) - ((strlen(text) * 8) / 2) - 15;
  734.   newwindow.TopEdge = 25;
  735.   newwindow.Width = (strlen(text) * 8) + 9;
  736.   newwindow.Height = 11;
  737.   newwindow.Screen = wbs;
  738.   newwindow.Type = WBENCHSCREEN;
  739.  
  740.   if ((w = (struct Window *) OpenWindow(&newwindow)) == NULL)
  741.     { printf("[Couldn't Open Window]\n"); return(0); }
  742.  
  743.   SetFont(w->RPort,newfont);
  744.  
  745.   SetDrMd(w->RPort,JAM1);
  746.   SetAPen(w->RPort,1);
  747.   SetRast(w->RPort,2);
  748.   Move(w->RPort,5,8);
  749.   Text(w->RPort,text,strlen(text));
  750.  
  751.   CloseFont(newfont);
  752.  
  753.   if (del != 0) Delay(50L*del);
  754.  
  755.   if (del != 0) { CloseWindow(w); dPtr->win = NULL; }
  756.   else dPtr->win = w;
  757.   wt = 0;
  758. }
  759.  
  760. CheckWindow()
  761. {
  762.   class = 0;
  763.  
  764.   while (message = (struct IntuiMessage *)GetMsg(w2->UserPort)) {
  765.     class = message->Class;
  766.     ReplyMsg(message);
  767.   }
  768.  
  769.   if (class != 0) return(1);
  770.  
  771.   return(0);
  772. }
  773.  
  774. CheckS2()
  775. {
  776.   struct Screen *ss;
  777.  
  778.   ss = IntuitionBase->FirstScreen;
  779.  
  780.   while (ss) {
  781.     if (s2 == ss) return(1);
  782.     ss = ss->NextScreen;
  783.   }
  784.   return(0);
  785. }
  786.  
  787. Randomize()
  788. {
  789.   long seconds,microseconds;
  790.  
  791.   CurrentTime(&seconds,µseconds);
  792.   srand((unsigned int)(microseconds));
  793. }
  794.  
  795. DoParms(argc, argv)
  796. int argc;
  797. char *argv[];
  798. {
  799.   showstatus = 0;
  800.  
  801.   for (i = 1; i < argc; i++) {
  802.     if (((argv[i][0] & 0x5f) == 'H') || (argv[i][0] == '?'))
  803.       showstatus = 1;
  804.     else
  805.     if ((argv[i][0] & 0x5f) == 'W') dPtr->windo = !dPtr->windo;
  806.     else
  807.     if ((argv[i][0] & 0x5f) == 'B') dPtr->bench = !dPtr->bench;
  808.     else
  809.     if ((argv[i][0] & 0x5f) == 'G') dPtr->grow = !dPtr->grow;
  810.     else
  811.     if ((argv[i][0] & 0x5f) == 'S') dPtr->scroll = !dPtr->scroll;
  812.     else
  813.     if ((argv[i][0] & 0x5f)  == 'D') {
  814.       k = dPtr->delay;
  815.       dPtr->delay = atoi(&argv[i][1]);
  816.       if ((dPtr->delay < 0) || (dPtr->delay > 500000)) dPtr->delay = k;
  817.     }
  818.     else
  819.     if ((argv[i][0] & 0x5f)  == 'P') {
  820.       k = dPtr->pri;
  821.       dPtr->pri = atoi(&argv[i][1]);
  822.       if ((dPtr->pri < -3) || (dPtr->pri > 20)) dPtr->pri = k;
  823.     }
  824.     else
  825.     if ((argv[i][0] & 0x5f)  == 'X') {
  826.       k = dPtr->x;
  827.       dPtr->x = atoi(&argv[i][1]);
  828.       if ((dPtr->x < 5) || (dPtr->x > 900)) dPtr->x = k;
  829.     }
  830.     else
  831.     if ((argv[i][0] & 0x5f)  == 'Y') {
  832.       k = dPtr->y;
  833.       dPtr->y = atoi(&argv[i][1]);
  834.       if ((dPtr->y < 5) || (dPtr->y > 900)) dPtr->y = k;
  835.     }
  836.     else
  837.     if ((argv[i][0] & 0x5f) == 'O') dPtr->now = 1;
  838.     else
  839.     if ((argv[i][0] & 0x5f) == 'R') dPtr->rgb = !dPtr->rgb;
  840.     else {
  841.       k = dPtr->wait;
  842.       dPtr->wait = atoi(&argv[i][0]);
  843.       if ((dPtr->wait < 5) || (dPtr->wait > 3600)) dPtr->wait = k;
  844.     }
  845.   }
  846. }
  847.  
  848. MadStatus()
  849. {
  850.   printf("\n\
  851.  Command Line Parameters                 Current Values\n\n\
  852.   #  -  wait # seconds before blanking        [%d]\n\
  853.  p#  -  Set task priority to #                [%d]\n\
  854.  x#  -  Width of window                       [%d]\n\
  855.  y#  -  Height of window                      [%d]\n\
  856.  d#  -  Delay (in thousands)                  [%d]\n",
  857.  dPtr->wait,dPtr->pri,dPtr->x,dPtr->y,dPtr->delay);
  858.  
  859.   printf("\n\
  860.   s  -  Scroll inside the square              [%s]\n\
  861.   g  -  Box changes sizes as it scrolls       [%s]\n\
  862.   b  -  Use WorkBench screen as background    [%s]\n",
  863.  dPtr->scroll ? (UBYTE *)"Yes" : (UBYTE *)"No",
  864.  dPtr->grow ? (UBYTE *)"Yes" : (UBYTE *)"No",
  865.  dPtr->bench ? (UBYTE *)"Yes" : (UBYTE *)"No");
  866.  
  867.   printf("\
  868.   r  -  Use original screen colors only       [%s]\n\
  869.   w  -  Open the small information window     [%s]\n\
  870.  on  -  Blank screen immediately\n\n",
  871.  dPtr->rgb ? (UBYTE *)"Yes" : (UBYTE *) "No",
  872.  dPtr->windo ? (UBYTE *)"Yes" : (UBYTE *)"No");
  873. }
  874.  
  875. GetPointer()
  876. {
  877.   GetPrefs(&MyCopy,(long)sizeof(MyCopy));
  878.   for (i=0; i<POINTERSIZE; i++)
  879.     PointerData[i] = MyCopy.PointerMatrix[i];
  880. }
  881.  
  882. ResetPointer()
  883. {
  884.   if (!cleared) return;
  885.  
  886.   for (i=0; i<POINTERSIZE; i++)
  887.     MyCopy.PointerMatrix[i] = PointerData[i];
  888.   SetPrefs(&MyCopy,(long)sizeof(MyCopy));
  889.  
  890.   cleared = 0;
  891. }
  892.  
  893. Eggzit(text,updating)
  894. char *text;
  895. int updating;
  896. {
  897.   ResetPointer();
  898.  
  899.   if (s) ScreenToBack(s);
  900.  
  901.   if (!updating)
  902.     {
  903.     if (inputReq)
  904.     {
  905.       inputReq->io_Command = IND_REMHANDLER;
  906.       inputReq->io_Data = (APTR)&handlerStuff;
  907.       DoIO(inputReq);
  908.  
  909.       CloseDevice(inputReq);
  910.       DeleteStdIO(inputReq);
  911.     }
  912.  
  913.     if (inputPort)    DeletePort(inputPort);
  914.     if (signum > -1)  FreeSignal(signum);
  915.  
  916.     if (dPtr->win) CloseWindow(dPtr->win);
  917.     dPtr->win = NULL;
  918.  
  919.     if (dPtr)
  920.     {
  921.       if (dPtr->mp.mp_Node.ln_Name)
  922.         RemPort(dPtr);
  923.       FreeMem(dPtr,(long)sizeof(struct defPort));
  924.     }
  925.   }
  926.  
  927.   if (bk) DisplayBeep(NULL);
  928.   else if ((text) && (!updating)) DisplayInfo(text,2);
  929.  
  930.   if (w2)
  931.     CloseWindow(w2);
  932.   if (s)
  933.     CloseScreen(s);
  934.   if (GfxBase)
  935.     CloseLibrary(GfxBase);
  936.   if (IntuitionBase)
  937.     CloseLibrary(IntuitionBase);
  938.  
  939.   (void)SetTaskPri(FindTask(NULL),0L);
  940.  
  941.   exit(0L);
  942. }
  943.